public class ValidateAddressesREST {
    public class Address {
        public String id;
        public String line1;
        public String line2;
        public String city;
        public String state;
        public String country;
        public String zipCode;
    }
    
    public class Result {
        public Boolean isValid;
        public List<resultDifference> differences;
        public Address testAddress;
        public Address validAddress;
    }
    
    public class ResultDifference {
        public String expecting;
        public String fieldName;
        public String received;
    }
    
    public List<Result> ValidateAddresses(List<ValidateAddressesREST.Address> listAddress) {
        List<Result> output = null;
        HTTP h = new HTTP(); 
        String endpoint = 'http://trg-mock-address-validator.herokuapp.com/rest/validateMultipleAddress';

		//TODO: HTTPRequest型の変数reqを作成し、デフォルトコンストラクタで作成したインスタンスを代入する
        HTTPRequest req = new HTTPRequest();
		//TODO: HTTPRequest変数reqに対してエンドポイントを変数endpointに設定する
        req.setEndpoint(endpoint);
        //TODO: HTTPRequestのリクエストメソッドを"POST"に設定
		req.setMethod('POST');
		//TODO: HttpRequestのヘッダを設定する。キーを"Accept"、値を"application/json"とする
        req.setHeader('Accept', 'application/json');
        //TODO: HttpRequestのヘッダを設定する。キーを"Content-Type"、値を"application/json"とする
		req.setHeader('Content-Type', 'application/json');
        //TODO: シリアライズした住所リストをリクエストボディに設定
		req.setBody(JSON.serialize(listAddress));
        System.debug('Request: ' + req.getBody());
        //TODO: リクエストを送信し、レスポンスをHTTPResponse型の変数respに代入する
		HTTPResponse resp = h.send(req);
        
        if (resp.getStatusCode() == 200) { // 200は「成功」時のステータスコード
            System.debug('Response: ' + resp.getBody());
            output = (List<Result>) JSON.deserialize(resp.getBody(), List<Result>.class);
        } else {
            // HTTPエラー時の処理
            Error_Log__c log = new Error_Log__c();
            log.trace__c = '';
            log.trace__c += 'Error: ' + resp.getStatusCode() + '\r\n';
			log.trace__c += 'Endpoint: ' + endpoint + '\r\n';
            log.trace__c += resp.getStatus() + '\r\n';
            log.trace__c += resp.getBody() + '\r\n';
            insert log;
        }
        return output;
    }
}